/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.model;

import com.db.SqlManager;
import com.exception.DataException;
import com.javabeans.Carrera;
import com.javabeans.CarreraEstudiante;
import com.javabeans.Estudiante;
import com.javabeans.Facultad;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Administrador
 */
public class AdminCarreraEstudiante implements CarreraEstudianteManager{
    private Connection c;
    public AdminCarreraEstudiante(Connection c){
        this.c = c;
    }
    @Override
    public List<CarreraEstudiante> getCarreraEstudiante(int codsis, int idGestion) throws DataException {
        List<CarreraEstudiante> c_e = new ArrayList<CarreraEstudiante>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT CE.IDCARRERA";
                   query +=", CE.ESTADO";
                   query +=", DATE_FORMAT(CE.FECHA,'%d/%m/%Y') FECHA";
                   query +=", E.NOMBRE";
                   query +=", E.APELLIDO_PA";
                   query +=", E.APELLIDO_MA";
                   query +=", E.CI";
                   query +=", C.NOMBRE";
                   query +=", C.SIGLA";
                   query +=", C.ACTIVO";
                   query +=", C.IDFACULTAD";
                   query +=", F.NOMBRE";
                   query +=", F.SIGLA";
                   query +=", IFNULL(M.IDMATRICULA,0) IDMATRICULA";
                   query +=" FROM CARRERA_ESTUDIANTE CE";
                   query +=" INNER JOIN ESTUDIANTE E ON CE.IDESTUDIANTE=E.IDESTUDIANTE";
                   query +=" INNER JOIN CARRERA C ON CE.IDCARRERA=C.IDCARRERA";
                   query +=" INNER JOIN FACULTAD F ON F.IDFACULTAD=C.IDFACULTAD";
                   query +=" LEFT JOIN MATRICULA M ON CE.IDESTUDIANTE=M.IDESTUDIANTE AND CE.IDCARRERA=M.IDCARRERA AND M.IDGESTION="+idGestion;
                   query +=" WHERE CE.IDESTUDIANTE = "+codsis+" AND E.ESTADO <>2"; // AND C.IDFACULTAD="+idFacultad+"
                   query +=" ORDER BY CE.ESTADO DESC";// necesitamos si o si el order by desc para la validacion ya q tienen el mismo nombre            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                CarreraEstudiante ce = new CarreraEstudiante();
                ce.setIdCarrera(rs.getInt("IDCARRERA"));
                ce.setEstado(rs.getInt("ESTADO"));
                ce.setFecha(rs.getString("FECHA"));
                
                Estudiante e = new Estudiante();
                e.setNombre(rs.getString("E.NOMBRE"));
                e.setApellidoPa(rs.getString("APELLIDO_PA"));
                e.setApellidoMa(rs.getString("APELLIDO_MA"));
                e.setCi(rs.getString("CI"));
                
                Facultad f = new Facultad();
                f.setNombre(rs.getString("F.NOMBRE"));
                f.setSigla(rs.getString("F.SIGLA"));
                
                Carrera c = new Carrera();
                c.setNombre(rs.getString("C.NOMBRE"));
                c.setSigla(rs.getString("SIGLA"));
                c.setActivo(rs.getBoolean("ACTIVO"));
                c.setAux(rs.getString("IDMATRICULA"));
                c.setIdFacultad(rs.getInt("C.IDFACULTAD"));                
                c.setFacultad(f);                
                ce.setEstudiante(e);
                ce.setCarrera(c);                
                c_e.add(ce);
            }
        }catch(SQLException e){
            throw new DataException(" AdminCarreraEstudiante -> getCarreraEstudiante(codsis,idfacultad,idGestion) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return c_e;
    }

    public List<CarreraEstudiante> getCarreraEstudianteAll(int codsis, int idFacultad, int idGestion) throws DataException {
        List<CarreraEstudiante> c_e = new ArrayList<CarreraEstudiante>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT CE.IDCARRERA";
                   query +=", CE.ESTADO";
                   query +=", DATE_FORMAT(CE.FECHA,'%d/%m/%Y') FECHA";
                   query +=", E.NOMBRE";
                   query +=", E.APELLIDO_PA";
                   query +=", E.APELLIDO_MA";
                   query +=", E.CI";
                   query +=", C.NOMBRE";
                   query +=", C.SIGLA";
                   query +=", C.ACTIVO";
                   query +=", IFNULL(M.IDMATRICULA,0) IDMATRICULA";
                   query +=" FROM CARRERA_ESTUDIANTE CE";
                   query +=" INNER JOIN ESTUDIANTE E ON CE.IDESTUDIANTE=E.IDESTUDIANTE";
                   query +=" INNER JOIN CARRERA C ON CE.IDCARRERA=C.IDCARRERA";
                   query +=" LEFT JOIN MATRICULA M ON CE.IDESTUDIANTE=M.IDESTUDIANTE AND CE.IDCARRERA=M.IDCARRERA AND M.IDGESTION="+idGestion;
                   query +=" WHERE CE.IDESTUDIANTE = "+codsis+" AND E.ESTADO <>2";
                   query +=" ORDER BY CE.ESTADO DESC";// necesitamos si o si el order by desc para la validacion ya q tienen el mismo nombre           
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                CarreraEstudiante ce = new CarreraEstudiante();
                ce.setIdCarrera(rs.getInt("IDCARRERA"));
                ce.setEstado(rs.getInt("ESTADO"));
                ce.setFecha(rs.getString("FECHA"));                
                Estudiante e = new Estudiante();
                e.setNombre(rs.getString("E.NOMBRE"));
                e.setApellidoPa(rs.getString("APELLIDO_PA"));
                e.setApellidoMa(rs.getString("APELLIDO_MA"));
                e.setCi(rs.getString("CI"));                
                Carrera c = new Carrera();
                c.setNombre(rs.getString("C.NOMBRE"));
                c.setSigla(rs.getString("SIGLA"));
                c.setActivo(rs.getBoolean("ACTIVO"));
                c.setAux(rs.getString("IDMATRICULA"));
                c.setIdFacultad(idFacultad);                
                ce.setEstudiante(e);
                ce.setCarrera(c);                
                c_e.add(ce);
            }
        }catch(SQLException e){
            throw new DataException(" AdminCarreraEstudiante -> getCarreraEstudianteAll(codsis,idFacultad,idGestion) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return c_e;
    }
	
	@Override
    public void saveCarreraEstudiante(CarreraEstudiante ce) throws DataException {
        PreparedStatement preSt = null;
        String query = "";
        try{
            query="INSERT INTO CARRERA_ESTUDIANTE VALUES("+ce.getIdCarrera();
            query+= ", "+ce.getIdEstudiante();
            query+= ", '"+ce.getFecha();
            query+= "', "+ce.getEstado()+")";            
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" saveCarreraEstudiante(CarreraEstudiante ce) "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
        
    public List<CarreraEstudiante> getCarreras(int idEstudiante, String psw) throws DataException {
        List<CarreraEstudiante> c_e = new ArrayList<CarreraEstudiante>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String  query = "SELECT C.IDCARRERA";
                    query +=", C.NOMBRE";
                    query +=", F.IDFACULTAD";
                    query +=", F.NOMBRE";
                    query +=", F.SIGLA";
                    query +=", IFNULL(M.IDMATRICULA,0) IDMATRICULA";
                    query +=", IFNULL(M.IDPERIODO,0) IDPERIODO";
                    query +=", IFNULL(G.IDGESTION,0) IDGESTION";
                    query +=", IFNULL(G.YEAR,0) YEAR";
                    query +=", IFNULL(G.ESTADO,0) ESTADO";
                    query +=", IFNULL(TG.IDTIPO_GESTION,0) IDTIPO_GESTION";
                    query +=", IFNULL(TG.NOMBRE,'') TGNOMBRE";
                    query +=" FROM CARRERA_ESTUDIANTE CE";
                    query +=" INNER JOIN ESTUDIANTE E ON CE.IDESTUDIANTE=E.IDESTUDIANTE";
                    query +=" INNER JOIN (CARRERA C INNER JOIN FACULTAD F ON C.IDFACULTAD=F.IDFACULTAD)";
                    query +=" ON CE.IDCARRERA=C.IDCARRERA";
                    query +=" LEFT JOIN MATRICULA M ON CE.IDESTUDIANTE=M.IDESTUDIANTE AND CE.IDCARRERA=M.IDCARRERA"; //-- AND M.IDGESTION=2 
                    query +=" LEFT JOIN  GESTION G ON M.IDGESTION =G.IDGESTION";
                    query +=" LEFT JOIN  TIPO_GESTION TG ON G.IDTIPO_GESTION = TG.IDTIPO_GESTION";
                    query +=" WHERE E.IDESTUDIANTE="+idEstudiante;
                    query +=" AND E.PASSWORD='"+psw+"'";
                    query +=" AND E.ESTADO = 1";
                    query +=" AND CE.ESTADO=1";
                    query +=" AND C.ACTIVO=1";
                    query +=" AND E.ESTADO<>2";
                    query +=" ORDER BY G.ESTADO DESC";// para asegurarnos q el activo sea 1ro            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Carrera c = new Carrera();
                c.setIdCarrera(rs.getInt("IDCARRERA"));
                c.setNombre(rs.getString("C.NOMBRE"));// tiene aux este objeto
                c.setAux(rs.getString("IDMATRICULA")+"_"+rs.getInt("IDPERIODO")+"_"+rs.getInt("IDGESTION")+"_"+rs.getInt("YEAR") +"_"+rs.getInt("ESTADO")+"_"+rs.getInt("IDTIPO_GESTION") +"_"+rs.getString("TGNOMBRE"));                
                
                Facultad f = new Facultad();
                f.setIdFacultad(rs.getInt("IDFACULTAD"));
                f.setNombre(rs.getString("F.NOMBRE"));
                f.setSigla(rs.getString("SIGLA"));
                c.setFacultad(f);
                
                CarreraEstudiante ce = new CarreraEstudiante();
                ce.setCarrera(c);
                
                c_e.add(ce);
            }
        }catch(SQLException e){
            throw new DataException("Error! AdminCarreraEstudiante -> getCarreras(idEstudiante, psw) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return c_e;
    }
    
}
